package org.remixlab.gnutopic.data;

import java.net.MalformedURLException;

import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcSunHttpTransportFactory;

/**
 * Clase que sirve de proxy para obtener los datos del sistema de foro phpBB3 usando xml-rpc
 * 
 * @author Andrés Mauricio Velandia Moya
 */

public class PhpBb3Proxy {

	private String username;	//nombre de usuario para autenticarse en el foro
	private String password;	//contraseña del usuario
	
	private String url;			//url a donde se encuentra el foro a conectarse.
	
	private XmlRpcClientConfigImpl config;	//clase que permite configurar el objeto client
	private XmlRpcClient client;		//cliente para conectarse al xml-rpc
	
	
	public PhpBb3Proxy(){
		
		//inicializo las variables por defecto
		username="admin";
		password="4nDr3s2o10";
		
		//url por defecto
		url="http://localhost/phpbb/ofapi/ofapi.php";
		
		//inicializo el cliente
		
		//creo el objeto para configurar el cliente
		config = new XmlRpcClientConfigImpl();
		
		//le agrego la url del servidor
		try {
			config.setServerURL(new URL(this.url));
			
			//creo el objeto client y le agrego el objeto config
			client = new XmlRpcClient();
			
			//agrego la fabrica de transporte por defecto
			client.setTransportFactory(new XmlRpcSunHttpTransportFactory(client));
		
			//agrego la configuración
			client.setConfig(config);
		
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Función que permite a un usuario loguearse en un foro.
	 * @return
	 */
	public Integer login(){
		Integer result = null;
		
		//información necesaria para el login
		String [] loginInfo = new String[] {username, password};
		
		Map<String, String[]> data = new ConcurrentHashMap<String, String[]>();
		
		//agrego los datos
		data.put("data", loginInfo);
		
		Object[] params = new Object[] {data};
		
		try {
			result = (Integer) client.execute("logging.login", params);
			
			System.out.println("el resultado fue: "+result);
			
		} catch (XmlRpcException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
		
	}
	
	/**
	 * Método que obtiene toda la información básica de un foro.
	 * @return un hash map con la información del foro.
	 */
	public HashMap<String, Object> getForumsTree(){
		HashMap<String, Object> result = null;
		
		//información necesaria para el login
		String [] loginInfo = new String[] {username, password};
		
		//se genera un hash map con la información de autenticación
		Map<String, String[]> data = new ConcurrentHashMap<String, String[]>();
		
		//agrego los datos para el login
		data.put("auth", loginInfo);
		
		Object[] params = new Object[] {data};
		
		try {
			result = (HashMap<String, Object>) client.execute("msgs.getForumsTree", params);
			
			System.out.println("El resultado fue: "+result);
			
		} catch (XmlRpcException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
	}
	
	
	//getters y setters
	public String getUsername() {
		return username;
	}


	public void setUsername(String username) {
		this.username = username;
	}


	public String getPassword() {
		return password;
	}


	public void setPassword(String password) {
		this.password = password;
	}


	public String getUrl() {
		return url;
	}


	public void setUrl(String url) {
		this.url = url;
	}
	
	//TODO: probador de la clase... temporal.. hacer un JUnit para probar 
	public static void main(String [] args){
		
		//creo un objeto de la clase
		PhpBb3Proxy phpBbProxy = new PhpBb3Proxy();
		
		//realizo el login...
		phpBbProxy.login();
		
		phpBbProxy.getForumsTree();
		
	}
	
}
